package com.wanho.java159.cb.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wanho.java159.cb.mapper.ItemMapper;
import com.wanho.java159.cb.mapper.TaskMapper;
import com.wanho.java159.cb.po.Item;
import com.wanho.java159.cb.po.ItemExample;
import com.wanho.java159.cb.po.Task;
import com.wanho.java159.common.util.IDUtil;
import com.wanho.java159.common.util.RedisUtil;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.weaver.IUnwovenClassFile;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Item 业务处理类
* @author ChaoFei.Zhang
* @date   2021-07-10
*/
@Service
@Transactional
public class ItemService {
    /**Item数据访问层对象*/
    @Resource
    private ItemMapper itemMapper ;
    @Resource
    private RedisUtil redisUtil ;
    @Resource
    private IDUtil idUtil ;
    @Resource
    private TaskMapper taskMapper ;
    @Resource
    private JmsTemplate jmsTemplate ;
    @Resource
    private ActiveMQTopic topic ;




    /**
     * 封装的私有方法：实现向任务表中动态添加数据
     * @param opeType
     * @param id
     */
    private boolean insertTask(String opeType,Long id){
        Task task = new Task();
        task.setTaskType("2");
        task.setId(idUtil.nextId());
        task.setCreateTime(new Date());
        task.setUpdateTime(new Date());
        task.setIsDeleted(false);
        task.setIsSynchronized(false);
        task.setNumberSynced(0);
        task.setOpeCount(3);
        task.setTableName("cb_item");
        task.setOpeType(opeType);
        task.setIsSuccessed(false);
        task.setTablePkCol("id");
        task.setTablePkVal(String.valueOf(id));
        return taskMapper.insert(task)>0 ;
    }

    /**
    * 查询所有 Item 状态为未删除 is_deleted=0 的数据
    * @return Item所有的数据
    */
    public List<Item> list(){
        ItemExample itemExample = new ItemExample();
        //查询 数据表中 is_deleted = 0
        itemExample.createCriteria().andIsDeletedEqualTo(false) ;
        return itemMapper.selectByExample(itemExample) ;
    }

    /**
    * 根据删除主键删除 Item 逻辑删除 进行is_deleted=1的修改操作
    * @param id Item的主键
    * @return true 删除成功  false 删除失败
    */
    public boolean remove(Long id){
        Item item = new Item();
        item.setId(id);
        item.setIsDeleted(true);
        boolean removeRs = itemMapper.updateByPrimaryKeySelective(item) > 0 ;
        //插入task 需要同步数据表中
        if (removeRs){
           return this.insertTask("3",id);
        }
        return  false;
    }

    /**
    * 新增一条Item记录
    * @param  item 封装新增的数据
    * @return true 新增成功  false 新增失败
    */
    public boolean save(Item item){
        item.setId(idUtil.nextId());
        item.setCreateTime(new Date());
        item.setUpdateTime(new Date());
        item.setIsDeleted(false);
        boolean saveRs = itemMapper.insert(item)>0 ;
        //插入task 需要同步数据表中
        if (saveRs){
            //新增商品成功后，向消息服务器发送商品id的消息内容
            //发送消息
            new Thread(()->{
                try {
                    //插入数据成功后  1s 后向消息服务器发送消息
                    Thread.sleep(1000);
                    jmsTemplate.send(topic, new MessageCreator() {
                        @Override
                        public Message createMessage(Session session) throws JMSException {
                            return session.createTextMessage(""+item.getId());
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
            //向定时任务表插入数据
            return this.insertTask("1",item.getId());
        }
        return  false;
    }

    /**
    * 修改一条Item记录
    * @param  item 封装修改的数据
    * @return true 修改成功  false 修改失败
    */
    public boolean update(Item item) {
        item.setUpdateTime(new Date());
        boolean uptRs = itemMapper.updateByPrimaryKeySelective(item)>0 ;
        //插入task 需要同步数据表中
        if (uptRs){
            return this.insertTask("2",item.getId());
        }
        return  false;
    }

    /*public PageInfo<Item> listPage(Long pageNum, Long pageSize,Item item) {
        PageHelper.startPage(pageNum.intValue(),pageSize.intValue());
        ItemExample itemExample = new ItemExample();
        ItemExample.Criteria criteria = itemExample.createCriteria();
        return new PageInfo<>(itemMapper.selectByExample(itemExample));
    }*/

    /*public Item get(Long id){
        return itemMapper.selectByPrimaryKey(id) ;
    }*/

    /**
    * 分页查询 Item  如果有查询条件需要动态在方法体内添加条件
    * @param pageNum 页码
    * @param pageSize 分页跨度
    * @param item 封装查询的数据
    * @return 分页对象
    */
    public PageInfo<Item> listPage(Long pageNum, Long pageSize,Item item) {
        //获得所有商品的id集合
        List<Long> idList = redisUtil.get("cb:item:id");
        //redis缓存中 有数据
        if (idList!=null && !idList.isEmpty()){
            //查询关键字为空 返回当前页数据
            int begin = (pageNum.intValue()-1)*pageSize.intValue() ;
            int end = pageNum.intValue()*pageSize.intValue()-1 ;
            end = end>idList.size()?idList.size():end ;
            List<Long> currPageIdList = idList.subList(begin, end);
            List<Item> itemList = new ArrayList<>() ;
            currPageIdList.forEach(id->{
                itemList.add(redisUtil.get("cb:item:"+id)) ;
            });
            PageInfo<Item> pageInfo = new PageInfo<>();
            pageInfo.setTotal(idList.size());
            pageInfo.setList(itemList);
            pageInfo.setPages((idList.size()+pageSize.intValue()-1)/pageSize.intValue());
            return pageInfo ;
        }
        //从源库mysql中查询
        PageHelper.startPage(pageNum.intValue(),pageSize.intValue());
        ItemExample itemExample = new ItemExample();
        ItemExample.Criteria criteria = itemExample.createCriteria();
        return new PageInfo<>(itemMapper.selectByExample(itemExample));
    }


    /**
     * 根据主键查询 Item
     * @param id Item的主键
     * @return null id不存在  返回Item对象
     */
    public Item get(Long id){
        //先从redis中查询 如果查不到 可能是没有数据同步【刚刚插入的mysql，还没来及插入到redis中】
        Item item = redisUtil.get("cb:item:" + id);
        if (item!=null){
            return item ;
        }
        //没有命中缓存，从源库中查询
        return itemMapper.selectByPrimaryKey(id) ;
    }

}